// 引入 electron 核心模块：
// - app：控制应用生命周期
// - BrowserWindow：创建和管理应用窗口
// - ipcMain：处理主进程与渲染进程间的通信
const { app, BrowserWindow, ipcMain } = require('electron');
// 引入 path 模块：用于处理文件路径（跨平台兼容）
const path = require('path');
// 引入 fs 模块：用于文件系统操作（读取配置文件等）
const fs = require('fs');

// 引入数据库模块
const { initDatabase, createTables, dbOperations } = require('./database');

// 引入文章相关IPC处理
const { setupArticleIpcHandlers } = require('./articleipc');

// 引入日志模块
const { setupFileLogging } = require('./logger');
// 初始化文件日志
setupFileLogging();


// 添加变量存储当前用户
let currentUser = null;


// 配置文件路径：固定为应用程序目录下的 users.json
// 用于存储系统登录信息（如用户账号密码等）
const USERS_PATH = path.join(__dirname, 'users.json');


/**
 * 创建登录窗口
 * 功能：展示登录界面，处理用户认证入口
 */
function createLoginWindow() {
  // 创建一个新的 BrowserWindow 实例
  let loginWin = new BrowserWindow({
    // 设置窗口标题
    title: '登录 - 个人技术博客系统',
    // 设置窗口图标
    icon: path.join(__dirname, 'allfile/main/static/images/logo.ico'),
    // 窗口创建后立即显示
    show: true,
    // 自动隐藏菜单栏
    autoHideMenuBar: true,
    // 设置窗口宽度
    width: 1100,
    // 设置窗口高度
    height: 800,
    // 设置窗口最小高度
    minHeight: 600,
    // 设置窗口最小宽度
    minWidth: 900,
    // 窗口的网页偏好设置
    webPreferences: {
      // 指定预加载脚本的路径
      preload: path.join(__dirname, 'preload.js'),
      // 启用上下文隔离
      contextIsolation: true,
      // 禁用 Node.js 集成
      nodeIntegration: false,
      // 完全禁用开发者工具
      devTools: false,
      // 启用webview标签
      webviewTag: true,
    }
  });

  // 加载登录页面的 HTML 文件
  loginWin.loadFile('allfile/main/login.html');

  // 监听窗口关闭事件
  loginWin.on('closed', () => {
    // 打印日志信息
    console.log('登录窗口已关闭');
    // 将窗口实例置为 null，以便垃圾回收
    loginWin = null;
  });

  // 返回创建的登录窗口实例
  return loginWin;
}


/**
 * 创建主窗口
 * 功能：展示系统主界面，用户登录后的操作入口
 */
function createMainWindow() {
  // 创建一个新的 BrowserWindow 实例
  let mainWin = new BrowserWindow({
    // 设置窗口标题
    title: '个人技术博客系统',
    // 设置窗口图标
    icon: path.join(__dirname, 'allfile/main/static/images/logo.ico'),
    // 初始隐藏窗口
    show: false, 
    // 自动隐藏菜单栏
    autoHideMenuBar: true,
    // 设置窗口宽度
    width: 1200,
    // 设置窗口高度
    height: 800,
    // 设置窗口最小宽度
    minWidth: 1000,
    // 设置窗口最小高度
    minHeight: 700,
    // 窗口的网页偏好设置
    webPreferences: {
      // 指定预加载脚本的路径
      preload: path.join(__dirname, 'preload.js'),
      // 启用上下文隔离
      contextIsolation: true,
      // 禁用 Node.js 集成
      nodeIntegration: false,
      // 完全禁用开发者工具
      devTools: false,
      // 启用webview标签
      webviewTag: true,
    }
  });

  // 加载主页面的 HTML 文件
  mainWin.loadFile('allfile/main/index.html');

  // 页面加载完成后显示窗口
  mainWin.webContents.on('did-finish-load', () => {
    mainWin.show();
  });

  // 监听窗口关闭事件
  mainWin.on('closed', () => {
    // 打印日志信息
    console.log('主窗口已关闭');
    // 将窗口实例置为 null，以便垃圾回收
    mainWin = null;
  });

  // 返回创建的主窗口实例
  return mainWin;
}


// 定义一个函数，用于验证用户凭证
function validateCredentials(username, password) {
  try {
    // 同步读取用户数据文件内容
    const rawData = fs.readFileSync(USERS_PATH);
    // 将读取的 JSON 数据解析为 JavaScript 对象
    const config = JSON.parse(rawData);
    
    // 在数据文件的用户列表中查找匹配的用户
    return config.users.find(user => 
      user.username === username && user.password === password
    );
  } catch (error) {
    // 打印数据文件读取失败的错误信息
    console.error('用户数据文件读取失败:', error);
    // 返回 null 表示验证失败
    return null; // 或返回特定错误信息
  }
}


// 当Electron应用初始化完成后执行
app.whenReady().then(() => {

  // 初始化数据库
  const db = initDatabase();

  // 创建数据库表
  createTables(db); 

  // 初始化文章相关的IPC事件处理
  setupArticleIpcHandlers(db, ipcMain);

  // 创建登录窗口
  const loginWin = createLoginWindow();
  
  // 处理渲染进程发送的登录请求
  ipcMain.handle('login-request', async (event, credentials) => {
    // 从 credentials 对象中解构出用户名和密码
    const { username, password } = credentials;
    // 调用 validateCredentials 函数验证用户凭证
    const user = validateCredentials(username, password);
    
    // 如果找到匹配的用户
    if (user) {
      // 返回登录成功的信息和用户信息
      return { success: true, user };
    }
    // 返回登录失败的信息和错误消息
    return { success: false, message: '用户名或密码错误' };
  });

  // 获取当前用户的IPC处理
  ipcMain.handle('get-current-user', () => {
      return currentUser;
  });
  
  // 处理渲染进程发送的登录成功事件
  ipcMain.on('login-success', (event, user) => {
    currentUser = user; // 保存当前用户

    // 1秒延迟
    setTimeout(() => {
      const mainWin = createMainWindow();
      mainWin.webContents.on('did-finish-load', () => {
        mainWin.webContents.send('user-authenticated', user);
      });
      const loginWindow = BrowserWindow.fromWebContents(event.sender);
      if (loginWindow) {
        loginWindow.close();
      }
    }, 1000); // 1000毫秒 = 1秒
  });

  // 处理渲染进程发送的退出系统请求
  ipcMain.on('logout-request', (event) => {
    currentUser = null; // 清除当前用户

    // 获取发送事件的窗口实例
    const currentWindow = BrowserWindow.fromWebContents(event.sender);
    // 如果当前窗口存在
    if (currentWindow) {
      // 关闭当前主窗口
      currentWindow.close();
      // 创建登录窗口
      createLoginWindow();
    }
  });


});


// 当所有窗口都被关闭时触发
// 监听所有窗口关闭事件
app.on('window-all-closed', () => {
  // 打印日志信息
  console.log('所有窗口已关闭');
  // 如果当前操作系统不是 macOS
  if (process.platform !== 'darwin') {
    // 退出应用
    app.quit();
  }
});